import time


from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

from selenium.webdriver.support.ui import Select

driver = webdriver.Chrome()

driver.get("http://www.baidu.com")

time.sleep(2)
"""
    窗口位置和大小
"""
driver.maximize_window()#窗口最大化
driver.minimize_window()#窗口最小化
driver.set_window_position(100,200)#设置浏览器窗口位置，左上角为原点
driver.set_window_size(100,200)#设置浏览器窗口大小

"""
    XPATH定位方式
"""
#普通定位（相对路径）
driver.find_element(By.XPATH,"//input[@name='lll']")#属性名name的值是lll的input元素
#普通定位（绝对路径）
driver.find_element(By.XPATH,"/html/input")#
#逻辑定位
driver.find_element(By.XPATH,"//input[@name='lll' and @value='www']")#属性名name的值是lll且value值是www的input元素
driver.find_element(By.XPATH,"//input[@name='lll' or @value='www']")#属性名name的值是lll或者value值是www的input元素
#文本方式定位
driver.find_element(By.XPATH,"//input[contains(text(),'kkk')]")#根据文本信息模糊定位input
driver.find_element(By.XPATH,"//input[text()='jdjd']")#根据文本信息定位input
#模糊定位
driver.find_element(By.XPATH,"//input[start_with(@name,'lisi)]")#属性名name的值以lisi开头的input元素
driver.find_element(By.XPATH,"//input[end_with(@name,'lisi)]")#属性名name的值以lisi结尾的input元素
driver.find_element(By.XPATH,"//input[contains(@name,'kkk')]")#属性名name的值中包含‘kkk’的input元素
#不限标签只限制属性定位
driver.find_element(By.XPATH,'//*[@name="lll"]') #只要name属性值为lll就选中不限标签类型

"""
    CSS_SELECTOR定位方式
"""
#普通css定位方式
driver.find_element(By.CSS_SELECTOR,'input[name="lll"]')
#css以id定位方式
driver.find_element(By.CSS_SELECTOR,'#lll')
#css以class方式定位
driver.find_element(By.CSS_SELECTOR,'.kkk')
#css以标签名定位
driver.find_element(By.CSS_SELECTOR,'button')
#逻辑定位
driver.find_element(By.CSS_SELECTOR,"input[id='llll'][name='nnn']")#同时包含id值为llll和name值为nnn的input元素
driver.find_element(By.CSS_SELECTOR,"input[id='llll'],input[name='nnn']")#id为llll的的input标签 或者 name为nnn的input标签
driver.find_element(By.CSS_SELECTOR,"input:not([id='llll'])")#id不为llll的的input标签
# #css层级定位
driver.find_element(By.CSS_SELECTOR,'input[id="lll"] > input')
#css模糊定位
driver.find_element(By.CSS_SELECTOR,'input[id^="lll"]')#以lll开头的id对应的input元素
driver.find_element(By.CSS_SELECTOR,'input[id$="lll"]')#以lll结尾的id对应的input元素
driver.find_element(By.CSS_SELECTOR,'input[id*="lll"]')#包含lll的id对应的input元素
"""
    根据id定位
"""
driver.find_element(By.ID,'lll')#id为lll的元素
"""
    根据name定位
"""
driver.find_element(By.NAME,'nnn')#name为nnn的元素
"""
    根据CLASS定位
"""
driver.find_element(By.CLASS_NAME,'nnn')#class值为nnn的元素
"""
    根据TAG_NAME定位
"""
driver.find_element(By.TAG_NAME,'input')#标签为input的元素（输入框）
"""
    根据链接标签定位即标签中包含herf属性的标签如a标签<a herf='http://www.baidu.com'></a>
"""
driver.find_element(By.PARTIAL_LINK_TEXT,"aaa")#根据文本模糊匹配，文本内容包含aaa的标签
driver.find_element(By.LINK_TEXT,"aaa")#根据文本精确匹配，文本内容为aaa的标签

"""
    获取标签属性
"""
element = driver.find_element(By.XPATH,"")
element.get_attribute("name")#获取该元素的name属性的值
"""
    等待方式
"""
#死等
time.sleep(10)#等待10秒
#隐式等待
driver.implicitly_wait(10)
#显式等待
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,'#kw'))).send_keys('baidu')
"""
    页面切换
"""
#获取句柄，切换窗口
handles = driver.window_handles #获取所有窗口句柄
driver.switch_to.window(handles[0])
handle = driver.current_window_handle #获取当前窗口句柄
#页面刷新
driver.refresh()
#后退页面（仅适用于只有一个窗口内的前进后退）
driver.back()
#页面前进
driver.forward()
#iframe框架
driver.switch_to.frame(driver.find_element(By.XPATH,""))
#跳转到指定窗口
driver.switch_to.window("跳转窗口的句柄")
driver.switch_to.parent_frame()#回到frame的父层，即外面一层
driver.switch_to.default_content() #回到最外层
"""
    鼠标动作操作
"""
#悬停到指定元素、持续时间、执行
action = ActionChains(driver)
action.move_to_element(driver.find_element(By.XPATH,"")).pause(2).perform()

#下拉列表选择，根据value属性
select = Select(driver.find_element(By.XPATH,""))
select.select_by_value("lisi") #根据value属性选择
select.select_by_visible_text("lisii")#根据显示的文本内容选择
"""
    弹窗（标准弹窗）
"""
#点击 确定
driver.switch_to.alert.accept()
#点击取消
driver.switch_to.alert.dismiss()
#获取弹窗文本
text = driver.switch_to.alert.text
#在弹窗中输入文本
driver.switch_to.alert.send_keys("输入的文本")
#清除输入的文本
driver.find_element(By.XPATH,'').clear()

"""
    非标准弹窗直接在页面上定位
"""
"""
    获取页面信息
"""
#获取页面的标题
title = driver.title
#获取页面的源码
page_source = driver.page_source
"""
    浏览器截图
"""
driver.get_screenshot_as_file("路径\XXX.jpg")#如果不加文件路径默认保存在当前文件夹下
driver.save_screenshot("XXX.jpg")#保存在当前文件夹
driver.quit()